package cbm.seguridad.controller;

import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;

import cbm.commons.BaseController;
import cbm.commons.ConstantsWeb;
import cbm.commons.RequestHelper;
import cbm.commons.ResultadoOperacionBean;
import cbm.commons.SessionContainer;
import ejb.cbm.commons.StackTrace2String;
import ejb.cbm.seguridad.bean.RegistroIngresoBean;
import ejb.cbm.seguridad.bean.UsuarioBean;
import ejb.cbm.seguridad.local.RegistroIngresoFacadeLocal;
import ejb.com.bbva.cbm.dominio.CentroCostoEntity;
import ejb.com.bbva.cbm.service.AdministracionServiceLocal;
import ejb.com.bbva.cbm.service.OperativaServiceLocal;
import ejb.com.bbva.cbm.util.DatosOperacion;

public class DatosIngresoController extends BaseController{
	
	private static Logger logger = Logger.getLogger(DatosIngresoController.class);
	
	@Autowired
	public RegistroIngresoFacadeLocal registroIngresoFacadeLocal;
	
	@Autowired
	private OperativaServiceLocal operativaServiceLocal;
	
	@Autowired
	private AdministracionServiceLocal administracionServiceLocal;

	public RegistroIngresoFacadeLocal getRegistroIngresoFacadeLocal() {
		return registroIngresoFacadeLocal;
	}

	public void setRegistroIngresoFacadeLocal(
			RegistroIngresoFacadeLocal registroIngresoFacadeLocal) {
		this.registroIngresoFacadeLocal = registroIngresoFacadeLocal;
	}
	
	public void setOperativaServiceLocal(OperativaServiceLocal operativaServiceLocal) {
		this.operativaServiceLocal = operativaServiceLocal;
	}

	public ModelAndView confirmarOficina(HttpServletRequest request, HttpServletResponse response){
		return new ModelAndView();
	}

	public ModelAndView open(HttpServletRequest request, HttpServletResponse response){
		String pagSiguiente = resources.getString("registro_ingreso");
		HttpSession session = request.getSession(false);
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);		
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		//UsuarioBean usuarioLogeado = (UsuarioBean)sessionContainer.getSessionElement(ConstantsWeb.USUARIO);
		RegistroIngresoBean registroIngresoBean = (RegistroIngresoBean)sessionContainer.getSessionElement(ConstantsWeb.REGISTRO_INGRESO);
		//Context context = null;
		
		try{
			
			//RegistroIngresoBean registroIngresoBeanTemp = new RegistroIngresoBean();
			//registroIngresoBeanTemp.setNumeroregistro(registroIngresoBean.getNumeroregistro());
			//context = new InitialContext();
			//registroIngresoFacadeLocal=(RegistroIngresoFacadeLocal)context.lookup("CBM/RegistroIngresoFacade/local");
			//registroIngresoBean = (RegistroIngresoBean)registroIngresoFacadeLocal.buscar(registroIngresoBeanTemp);
			
			List<RegistroIngresoBean> lstRegistroIngresoBean = registroIngresoFacadeLocal.buscar(registroIngresoBean);
			if(lstRegistroIngresoBean.size()>0){
				registroIngresoBean.setNumeroregistro(((RegistroIngresoBean)lstRegistroIngresoBean.get(0)).getNumeroregistro());
				sessionContainer.addSessionElement(ConstantsWeb.REGISTRO_INGRESO, registroIngresoBean);
			}
			
		}catch(RuntimeException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error");
			resultado.setMensaje(ConstantsWeb.MSGERROR);
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch(Exception e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error");
			resultado.setMensaje(ConstantsWeb.MSGERROR);
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}
		
		return new ModelAndView(pagSiguiente);
	}

	public ModelAndView save(HttpServletRequest request, HttpServletResponse response){
		HttpSession session = request.getSession(false);
		//String paginaSig = resources.getString("ajaxrequest");
		String paginaSig = resources.getString("registro_ingreso");
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);		
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		UsuarioBean usuarioLogeado = (UsuarioBean)sessionContainer.getSessionElement(ConstantsWeb.USUARIO);
		RegistroIngresoBean registroIngresoSession = (RegistroIngresoBean)sessionContainer.getSessionElement(ConstantsWeb.REGISTRO_INGRESO);
		Context context = null;
		
		try{
			Long numeroRegistro = RequestHelper.getParameterLong(request, "hidNumeroRegistro");
			String oficina = RequestHelper.getParameterString(request, "txtOficina").toUpperCase();
			String terminal = RequestHelper.getParameterString(request, "txtTerminal").toUpperCase();
			
			RegistroIngresoBean registroIngresoBean = new RegistroIngresoBean();
			registroIngresoBean.setNumeroregistro(numeroRegistro);
			registroIngresoBean.setCodigoterminal(terminal);
			registroIngresoBean.setCodigooficina(oficina);
			
			CentroCostoEntity centroCosto = administracionServiceLocal.obtenerCentroCostoPorOficinaId(registroIngresoBean.getCodigooficina());
			registroIngresoBean.setCentroCosto(centroCosto);
			
			//context = new InitialContext();
			//registroIngresoFacadeLocal=(RegistroIngresoFacadeLocal)context.lookup("CBM/RegistroIngresoFacade/local");
			registroIngresoFacadeLocal.save(registroIngresoBean,usuarioLogeado);
			
			//Se modifica la informacion del registro en sesion
			registroIngresoSession.setCodigooficina(registroIngresoBean.getCodigooficina());
			registroIngresoSession.setCodigoterminal(registroIngresoBean.getCodigoterminal());
			registroIngresoSession.setCentroCosto(centroCosto);
			
		}catch(RuntimeException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error");
			resultado.setMensaje(ConstantsWeb.MSGERROR);
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch(Exception e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error");
			resultado.setMensaje(ConstantsWeb.MSGERROR);
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}
		
		sessionContainer.addTemporal(ConstantsWeb.RESULTADO_OPERACION, resultado);
		
		return new ModelAndView(paginaSig,"responseText",resultado.getAsArrayJS());
	}
	
	
	public ModelAndView verificarCajasAperturadas(HttpServletRequest request, HttpServletResponse response){
		String pagSiguiente = resources.getString("ajaxrequest");
		String resultado = "0";
		try{
		DatosOperacion datosOperacion = operativaServiceLocal.obtenerDatosOperacionCajero(getOficinaId(request), getTerminalId(request));
		if(datosOperacion.getCajasApertura() == null || datosOperacion.getCajasApertura().size() == 0) {
			resultado = "0";
		}else{
			resultado = "1";
		}
		}catch(Exception e){
			resultado = "-1";
			logger.error(e);
		}
		return new ModelAndView(pagSiguiente,"responseText",resultado);
	}
	
	public ModelAndView consultarCajasAperturadas(HttpServletRequest request, HttpServletResponse response){
		String pagSiguiente = resources.getString("ajaxrequest");
		String resultado = "0";
		try{
		String oficinaId = request.getParameter("oficinaId");
		String terminalId = request.getParameter("terminalId");
		DatosOperacion datosOperacion = operativaServiceLocal.obtenerDatosOperacionCajero(oficinaId, terminalId);
		
		if(datosOperacion.getCajasApertura() == null || datosOperacion.getCajasApertura().size() == 0) {
			resultado = "0";
		}else{
			resultado = "1";
		}
		}catch(Exception e){
			resultado = "-1";
			logger.error(e);
		}
		return new ModelAndView(pagSiguiente,"responseText",resultado);
	}
	
}
